let age:Number=20
console.log(typeof age)// number

/**
 * 类型别名
 * 因为有的类型名称较长，可以使用type给类型起一个别名
 */
type s=string
const str1:s='abc'
console.log(typeof str1)// string


/**
 * 给复杂类型起一个别名
 */
type NewType=string|number
let a:NewType=1
let b:NewType='a'
console.log(typeof a)// number
console.log(typeof b)// string

/**
 * 定义数组
 */
let arrayNumber:Array<number>=[1,2,3]
console.log(arrayNumber)// [ 1, 2, 3 ]

/**
 * 定义函数
 */

function addFn(a:number,b:number):number{
  return a+b
}
console.log(addFn(1,2))

type Fn=(n1:number,n2:number)=>number
const add3:Fn=(a,b)=>a+b
console.log(add3(1,11))// 12


// 统一定义函数格式
// 当多个函数类型一致时，写多个就显得代码冗余，所以需要统一定义函数格式，
const add1=(a:number,b:number):number=>a+b
function addFn1(a:number=100,b:number=200):number{
  return a+b
}
console.log(add1(1,2))// 3
console.log(addFn1())// 300

type ADDFN =(n1:number,n2:number)=>number
const add4:ADDFN=(a,b)=>a+b
console.log(add4(4,7))
// ?如果函数没有返回值，那么类型定义为void或者什么都不写

// 可选参数
function selectFn(a:number,b?:number):void{
  console.log(a)
  console.log(b)
  // ?注意当参数为可选择状态时，不要进行赋值等相关操作
}

selectFn(1,10)

// 接口
// ?如果一个对象类型被多次使用有两种方式来描述对象，达到复用的目的：类型别名，type；接口，interface。

interface IPerson{
  name:string,
  age:number,
  func:()=>string
}

const person1:IPerson={
  name:'张三',
  age:20,
  func:()=>{
    console.log('hello')
    return '123'
  }
}
person1.func()

// ?interface只能为对象指定类型，type可以为任意类型指定别名。建议使用type来代替interface

type TPerson={
  name:string,
  age:number,
  func:()=>string
  
}

const person2:TPerson={
  name:'张三',
  age:20,
  func:()=>{
    console.log('hello')
    return '123'
  }
}
person2.func()















